package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流---传对象--高级流
 * ObjectOutputStream  对象输出流----传Person.java对象---写操作
 * ObjectInputStream   对象输入流----传Person.java对象---读操作
 */
public class ObjectIO {
    /**
     * ObjectOutputStream 对象输出流
     * 使用方式：1.创建实现序列化接口的对象
     *         2.对象输出流---xxx.obj文件
     *                      传输对象，指定格式obj
     */
    @Test
    public void testOOS() {
        //1.创建Person对象
        Person p=new Person();
        p.setName("韩美娟");
        //数组--动态数组
        //  String【】 str={“1”，“2”，“3”} 静态数组
        //  String【】 str=new String【】{“1”}
        p.setSay(new String[]{"百因必有果，你的报应就是我--"});
        System.out.println("打印对象："+p);

        //对象输出流写出文件   xxx.obj  Person.java
        try {
            FileOutputStream fos=new FileOutputStream("person.obj");
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            /**
             *   writObject(Object obj)       ----理解:写出对象
             *   该方法会将给定的对象按照其结构进行转换
             *   转换为一组“组”字节，在通过其处理的流写出
             *
             *   写出文件专业术语
             *   1.通过对象输出流 将Person类 先转换为一组“组”字节 这个过程【对象的序列化】
             *   2.将序列化后的字节在通过字节流【低级流】写入文件中
             *   【硬盘上】做长久保存，这个过程【数据持久化】 person.obj
             *   将person.obj持久化保存硬盘上
             *
             */
            oos.writeObject(p);
        }catch(FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        System.out.println("写出成功-");

    }

    /**
     * ObjectInputStream 对象输入流
     * 序列化：将对象转换为二进制
     * 反序列化 ：二进制转为对象
     * readObject（） 返回读取的对象【？】
     * 需求：将序列化person.obj文件 按照对象方式读入
     */
    @Test
    public void testOIS()  {
        //创建低级流
        try {
            FileInputStream fis=new FileInputStream("person.obj");
            //创建高级流--对象读入
            ObjectInputStream ois=new ObjectInputStream(fis);
            //readObject（） 获取对象【反序列化操作：二进制转换为对象】 唯一标识
            System.out.println(ois.readObject());
        }catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
        }
        System.out.println("反序列化成功！");
    }
}
